﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Data;

namespace DEVOS.Generador
{
    public abstract class AdministradorBD
    {
        private static BD bdActual;
        private static Dictionary<String, BD> diccionarioBDs;

        #region "Metodos"
        public static BD BDActual
        {
            get {
                if (bdActual == null)
                {
                    bdActual = new BD("master");
                }
                if (bdActual.NombreBD.Equals(String.Empty))
                {
                    bdActual.NombreBD = "master";
                }
                if (bdActual.DiccionarioTablas == null)
                {
                    String nombreTabla;
                    String nombreColumna;
                    String tipoColumna;

                    try
                    {
                        bdActual.DiccionarioTablas = new Dictionary<string, Tabla>();
                        foreach (DataRow fila in AdministradorBD.getDataTable(bdActual.NombreBD, Constantes.queryTablas).Rows)
                        {
                            nombreTabla = fila["nombreTabla"].ToString().ToUpper();
                            bdActual.DiccionarioTablas.Add(nombreTabla, new Tabla(nombreTabla));
                        }

                        foreach (DataRow fila in AdministradorBD.getDataTable(bdActual.NombreBD, Constantes.queryColumnas).Rows)
                        {
                            nombreTabla = fila["nombreTabla"].ToString().ToUpper();
                            nombreColumna = fila["nombreColumna"].ToString().ToUpper();
                            tipoColumna = fila["tipoColumna"].ToString().ToUpper();
                            bdActual.DiccionarioTablas[nombreTabla].ColumnasTabla.Add(new Columna(nombreColumna, tipoColumna));
                        }

                        String nombreProcedimiento;
                        String textoProcedimiento;

                        bdActual.DiccionarioProdecimientos = new Dictionary<string, Procedimiento>();
                        foreach (DataRow fila in AdministradorBD.getDataTable(bdActual.NombreBD, Constantes.queryProcedimientos).Rows)
                        {
                            nombreProcedimiento = fila["nombreProcedimiento"].ToString().ToUpper();
                            textoProcedimiento = fila["textoProcedimiento"].ToString();
                            bdActual.DiccionarioProdecimientos.Add(nombreProcedimiento, new Procedimiento(nombreProcedimiento, textoProcedimiento));
                        }
                    }
                    catch (Exception e)
                    {
                        throw e;
                    }
                }

                return bdActual; 
            }
            set
            {
                if (!BDActual.NombreBD.Equals(value.NombreBD))
                {
                    bdActual = value;
                }
            }
        }
        
        public static Dictionary<String, BD> DiccionarioBDs
        {
            get 
            {
                if (diccionarioBDs == null || diccionarioBDs.Count==0)
                {
                    String nombreBD;
                    diccionarioBDs = new Dictionary<String, BD>();
                    DataTable tabla=null;
                    try
                    {
                        tabla = AdministradorBD.getDataTable("master", Constantes.queryBDs);
                    }
                    catch(Exception e)
                    {
                        throw e;
                    }
                    
                    foreach (DataRow fila in tabla.Rows)
                    {
                        nombreBD = fila["nombreBD"].ToString().ToUpper();
                        diccionarioBDs.Add(nombreBD, new BD(nombreBD));
                    }
                }
                return diccionarioBDs;
            }
        }

        public static DataTable getDataTable(String nombreBD, String cadenaComando)
        {
            Coneccion.InitialCatalog = nombreBD;
            DataTable dataTable=null;
            try
            {
                dataTable = Coneccion.getDataTable(cadenaComando);
            }
            catch (Exception e)
            {
                throw e;
            }
            return dataTable;
        }

        public static DataSet getDataSet(String nombreBD, String cadenaComando)
        {
            Coneccion.InitialCatalog = nombreBD;
            DataSet dataSet=null;
            try
            {
                dataSet = Coneccion.getDataSet(cadenaComando);
            }
            catch (Exception e)
            {
                throw e;
            }
            return dataSet;
        }

        public static int ejecutar(String nombreBD, String cadenaComando)
        {
            Coneccion.InitialCatalog = nombreBD;
            int filasAfectadas=-1;
            try
            {
                filasAfectadas = Coneccion.ejecutar(cadenaComando);
            }
            catch (Exception e)
            {
                throw e;
            }
            return filasAfectadas;
        }
        #endregion
    }
}
